package com.sdtv.mediunfusion.utils;

import android.content.Context;

import com.baidu.location.BDAbstractLocationListener;
import com.baidu.location.BDLocation;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.map.MyLocationData;
import com.blankj.utilcode.util.LogUtils;
import com.sdtv.mediunfusion.base.config.MediumApplication;

/**
 * Created by guo on 2018/4/17.
 * 获取当前位置的坐标
 */

public class SendLocationHelper extends BDAbstractLocationListener {


    public static volatile SendLocationHelper instance;
    private LocationClient mLocationClient = null;
    private Context context;
    // 位置监听 显示到地图上
    private MapListener mapListener;

    public SendLocationHelper(Context context) {
        this.context = context;
        //获取当前定位
        mLocationClient = new LocationClient(MediumApplication.getContext());
    }


    /**
     * 获取定位信息监听
     *
     * @param context
     * @param listener
     */
    public SendLocationHelper(Context context, MapListener listener) {
        this.context = context;
        this.mapListener = listener;
        //获取当前定位
        mLocationClient = new LocationClient(context);
    }

    public static SendLocationHelper getInstance(Context con) {
        if (null == instance) {
            synchronized (SendLocationHelper.class) {
                if (null == instance) {
                    instance = new SendLocationHelper(con);
                }
            }
        }
        return instance;
    }

    public void setMapListener(MapListener mapListener) {
        this.mapListener = mapListener;
    }

    @Override
    public void onReceiveLocation(BDLocation location) {
        double latitude = location.getLatitude();    //获取纬度信息
        double longitude = location.getLongitude();    //获取经度信息
        float radius = location.getRadius();    //获取定位精度，默认值为0.0f
        String coorType = location.getCoorType();

        //获取经纬度坐标类型，以LocationClientOption中设置过的坐标类型为准
        int errorCode = location.getLocType();
        LogUtils.e("SendLocationHelper", "纬度latitude: " + latitude + " \n 经度longitude: " + longitude
                + " \n 获取定位精度radius: " + radius + " \n 获取经纬度坐标类型 coorType: " + coorType
                + " \n errorCode: " + errorCode + " \n 地址：" + location.getAddrStr());
        if (errorCode == 61 || errorCode == 161) {
            //将地址信息发送到服务器
            sendMessageToServer(latitude, longitude);
            if (null != mapListener) {
                MyLocationData locData = new MyLocationData.Builder()
                        .accuracy(location.getRadius())
                        // 此处设置开发者获取到的方向信息，顺时针0-360
                        .direction(location.getDirection()).latitude(latitude)
                        .longitude(longitude).build();
                mapListener.loadPosition(locData, location.getAddrStr());
            }
        }


    }

    public void startGetLngAndLat() {
        //声明LocationClient类
        if (null == mLocationClient) {
            mLocationClient = new LocationClient(MediumApplication.getContext());
        }
        mLocationClient.registerLocationListener(this);
        LocationClientOption option = new LocationClientOption();
        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
        //可选，设置定位模式，默认高精度
        //LocationMode.Hight_Accuracy：高精度；
        //LocationMode. Battery_Saving：低功耗；
        //LocationMode. Device_Sensors：仅使用设备；
        option.setCoorType("bd09ll");
        //可选，设置返回经纬度坐标类型，默认gcj02
        //gcj02：国测局坐标；
        //bd09ll：百度经纬度坐标；
        //bd09：百度墨卡托坐标；
        //海外地区定位，无需设置坐标类型，统一返回wgs84类型坐标
        //设置显示地址
        option.setIsNeedAddress(true);
        option.setScanSpan(1000 * 60 * 5);
        //可选，设置发起定位请求的间隔，int类型，单位ms
        //如果设置为0，则代表单次定位，即仅定位一次，默认为0
        //如果设置非0，需设置1000ms以上才有效

        option.setOpenGps(true);
        //可选，设置是否使用gps，默认false
        //使用高精度和仅用设备两种定位模式的，参数必须设置为true

        option.setLocationNotify(false);
        //可选，设置是否当GPS有效时按照1S/1次频率输出GPS结果，默认false

        option.setIgnoreKillProcess(true);
        //可选，定位SDK内部是一个service，并放到了独立进程。
        //设置是否在stop的时候杀死这个进程，默认（建议）不杀死，即setIgnoreKillProcess(true)

        option.SetIgnoreCacheException(false);
        //可选，设置是否收集Crash信息，默认收集，即参数为false
        option.setWifiCacheTimeOut(5 * 60 * 1000);
        //可选，7.2版本新增能力
        //如果设置了该接口，首次启动定位时，会先判断当前WiFi是否超出有效期，若超出有效期，会先重新扫描WiFi，然后定位
        option.setEnableSimulateGps(false);
        //可选，设置是否需要过滤GPS仿真结果，默认需要，即参数为false
        mLocationClient.setLocOption(option);
        startGetLocation();
    }

    /**
     * 开始获取经纬度
     */
    private void startGetLocation() {
        if (null != mLocationClient) {
            mLocationClient.start();
        }
    }

    /**
     * 暂停获取经纬度
     */
    public void stopGetLocation() {
        if (null != mLocationClient) {
            mLocationClient.stop();
            instance = null;
            mLocationClient = null;
        }
    }

    /**
     * 将经纬度信息发送到 服务器
     *
     * @param lat 纬度
     * @param lon 经度
     */
    private void sendMessageToServer(double lat, double lon) {
//        HashMap<String, String> map = new HashMap<>();
//        map.put("model", "mobile/location");
//        map.put("method", "geoDetail");
//        map.put("longitude", lon + "");
//        map.put("latitude", lat + "");
//        map.put("userKey", CommonUtils.getValueByKey("getLoaclUserKey"));
//        MDataSource<Customer> dataSource = new MDataSource<>(context);
//        if (!CommonUtils.isEmpty(AppConfig.LOCAL_API_URL)) {
//            dataSource.getDetail(AppConfig.LOCAL_API_URL, map, new LoadListCallBack() {
//                @Override
//                public void loadList(List list) {
//
//                }
//
//                @Override
//                public void systemError(Request request, String errorInfo, Exception e) {
//
//                }
//
//                @Override
//                public void retLoad(String code) {
//
//                }
//
//                @Override
//                public void loadString(String string) {
//                    PrintLog.printDebug("SendLocationHelper", "---上传位置信息：" + string);
//                }
//            });
//        }
    }

    /**
     * 地图view的监听
     */
    public interface MapListener {
        /**
         * locatioN 监听
         *
         * @param locationData
         * @param location     具体位置
         */
        void loadPosition(MyLocationData locationData, String location);
    }


}
